fslr and ANTsR:
library(ms.lesion) library(neurobase) all_files = get_image_filenames_list_by_subject( group = "training", type = "coregistered") files = all_files$training05 # NOT training subject 1! t1 = readnii(files["T1"]) rt1 = robust_window(t1) mask = readnii(files["Brain_Mask"])
hist(t1, mask = mask, breaks = 2000); text(x = 800, y = 3000, "outliers!")
ortho2(rt1, t1 > 400, xyz = xyz(t1 > 400)) # xyz - cog of a region
The fslr function fast calls fast from FSL. The --nobias option tells FSL to not perform inhomogeneity correction (N4 already performed in ANTsR).
t1file = files["T1"]
t1fast = fast(t1,
outfile = paste0(nii.stub(t1file), "_FAST"),
opts = "--nobias")
FAST assumes three tissue classes and produces an image with the three labels, ordered by increasing within-class mean intensities. In a T1 image, this results in:
ortho2(rt1, t1fast == 3, col.y = alpha("red", 0.5), text = "White Matter")
ortho2(rt1, t1fast == 2, col.y = alpha("red", 0.5), text = "Gray Matter")
ortho2(rt1, t1fast == 1, col.y = alpha("red", 0.5), text = "CSF")
robust_fast = fast(rt1, # the robust_window(t1)
outfile = paste0(nii.stub(t1file), "_FAST"),
opts = "--nobias")
robust_windowextrantsr::otropos function works with nifti objects
ANTsR::atropos functiont1_otropos = otropos(a = t1, x = mask) # using original data t1seg = t1_otropos$segmentation
ortho2(rt1, t1seg == 3, col.y = alpha("red", 0.5), text = "White Matter")
ortho2(rt1, t1seg == 2, col.y = alpha("red", 0.5), text = "Gray Matter")
ortho2(rt1, t1seg == 1, col.y = alpha("red", 0.5), text = "CSF")
robust_windowrobust_t1_otropos = otropos(a = rt1, x = mask) # using robust robust_t1seg = robust_t1_otropos$segmentation
double_ortho(rt1, robust_t1seg)
ortho2(rt1, robust_t1seg == 3, col.y = alpha("red", 0.5), text = "White Matter")
ortho2(rt1, robust_t1seg == 2, col.y = alpha("red", 0.5), text = "Gray Matter")
ortho2(rt1, robust_t1seg == 1, col.y = alpha("red", 0.5), text = "CSF")
We can create a table which will count the number of voxels in each category:
tab_fsl = table(robust_fast[ robust_fast != 0])
tab_ants = table(robust_t1seg[ robust_t1seg != 0])
names(tab_fsl) = names(tab_ants) = c("CSF", "GM", "WM")
tab_fsl
CSF GM WM 4789050 6824607 2851078
tab_ants
CSF GM WM 1208489 2946595 2684970
By multiplying by the voxel resolution (in cubic centimeters) using the voxres function, we can get volumes
vres = oro.nifti::voxres(t1, units = "cm") print(vres)
[1] 0.0001757813
vol_fsl = tab_fsl * vres vol_fsl
CSF GM WM 841.8252 1199.6380 501.1661
vol_ants = tab_ants * vres vol_ants
CSF GM WM 212.4297 517.9562 471.9674
Avants, Brian B, Nicholas J Tustison, Jue Wu, Philip A Cook, and James C Gee. 2011. “An Open Source Multivariate Framework for N-Tissue Segmentation with Evaluation on Public Data.” Neuroinformatics 9 (4). Springer:381–400.
Zhang, Yongyue, Michael Brady, and Stephen Smith. 2001. “Segmentation of Brain MR Images Through a Hidden Markov Random Field Model and the Expectation-Maximization Algorithm.” Medical Imaging, IEEE Transactions on 20 (1):45–57. http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=906424.